package com.yuzhitong.shapi.base.recycler;

import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

/**
 * 可设置HeadView的Adapter
 * @param <T> 数据类型
 */
public abstract class BaseItemsAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {
    public static final int TYPE_HEADER = 0;
    private List<T> dataList = new ArrayList<>();

    private View headerView;

    private OnItemClickListener<T> itemListener;

    @Override
    public final int getItemViewType(int position) {
        // 没有headView
        if (headerView == null) return getLayoutType(position);
        // 有headView，position为0
        if (position == 0) return TYPE_HEADER;
        // 普通情况
        return getLayoutType(position - 1);
    }

    @NonNull
    @Override
    public final BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 如果是headView，新建headView的ViewHolder
        if (headerView != null && viewType == TYPE_HEADER) return new BaseViewHolder(headerView);
        // 创建itemView的viewHolder
        return onCreate(parent, viewType);
    }

    @Override
    public final void onBindViewHolder(@NotNull BaseViewHolder viewHolder, int position) {
        // 如果是headView，不绑定数据
        if (getItemViewType(position) == TYPE_HEADER) return;
        // 获取ViewHolder在数据列表中的位置
        final int pos = getRealPosition(viewHolder);
        // 获取数据
        final T data = this.dataList.get(pos);
        // 重写绑定事件
        onBind(viewHolder, pos, data);
        // 设置item的点击事件
        if (itemListener != null) {
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    itemListener.onItemClick(pos, data);
                }
            });
        }
    }

    @Override
    public void onAttachedToRecyclerView(@NotNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        // headView修改layoutManager为占整行
//        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
//        if (manager instanceof GridLayoutManager) {
//            final GridLayoutManager gridManager = ((GridLayoutManager) manager);
//            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
//                @Override
//                public int getSpanSize(int position) {
//                    return getItemViewType(position) == TYPE_HEADER
//                            ? gridManager.getSpanCount() : 1;
//                }
//            });
//        }
    }

    @Override
    public void onViewAttachedToWindow(@NotNull BaseViewHolder holder) {
        super.onViewAttachedToWindow(holder);
        ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
        if (lp instanceof StaggeredGridLayoutManager.LayoutParams
                && holder.getLayoutPosition() == 0) {
            StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
            p.setFullSpan(true);
        }
    }

    @Override
    public int getItemCount() {
        return headerView == null ? dataList.size() : dataList.size() + 1;
    }

    /**
     * 设置单个item点击事件
     *
     * @param listener 点击事件
     */
    public void setOnItemClickListener(OnItemClickListener<T> listener) {
        itemListener = listener;
    }

    /**
     * 设置HeadView
     *
     * @param headerView 需要设置的HeadView
     */
    public void setHeaderView(View headerView) {
        if (headerView == null) {
            return;
        }
        headerView.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT));
        this.headerView = headerView;
        notifyItemInserted(0);
    }

    /**
     * 获取HeadView
     *
     * @return 设置的HeadView
     * 可能为空
     */
    public View getHeaderView() {
        return headerView;
    }

    /**
     * 添加数据列表
     *
     * @param data 数据列表
     */
    public void addData(List<T> data) {//刷新数据
        this.dataList.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 设置数据列表
     *
     * @param dataList 数据列表
     */
    public void setDataList(List<T> dataList) {
        this.dataList.clear();
        this.dataList.addAll(dataList);
    }

    /**
     * 清空数据列表
     *
     */
    public void clearList() {
        this.dataList.clear();
    }


    public List<T> getDataList() {
        return dataList;
    }

    /**
     * 获取ViewHolder的在列表数据中的位置
     *
     * @param holder
     * @return
     */
    public int getRealPosition(RecyclerView.ViewHolder holder) {
        int position = holder.getLayoutPosition();
        return headerView == null ? position : position - 1;
    }

    /**
     * 创建itemView跟布局
     *
     * @param parent   父布局
     * @param viewType 布局类型
     * @return ViewHolder
     */
    public abstract BaseViewHolder onCreate(ViewGroup parent, final int viewType);

    /**
     * 绑定数据
     *
     * @param viewHolder   ViewHolder
     * @param RealPosition 列表中的位置
     * @param data         数据
     */
    public abstract void onBind(BaseViewHolder viewHolder, int RealPosition, T data);

    /**
     * 获取position所在的位置的布局类型
     * @param RealPosition
     * @return
     */
    public abstract int getLayoutType(int RealPosition);

    /**
     * 单个item点击事件监听
     *
     * @param <T> recyclerView中的数据泛型
     */
    public interface OnItemClickListener<T> {
        void onItemClick(int position, T data);
    }

}
